package com.qfmy.core.interceptor;

import com.qfmy.common.pojo.TokenVo;
import com.qfmy.common.utils.JwtUtils;
import com.qfmy.common.utils.StringUtils;
import com.qfmy.core.base.service.TokenService;
import com.qfmy.core.constant.CommonConstants;

import com.qfmy.core.pojo.entity.ErrorCode;
import com.qfmy.core.pojo.exception.CustomException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @ClassName: LoginInterceptor
 * @author： zhengjt
 * @data： 2022/6/6 14:10
 * @version：1.0
 * @描述： 登录拦截器，用于登录时对token进行校验
 */
@Component
@Slf4j
public class LoginInterceptor implements HandlerInterceptor {

    @Autowired
    private TokenService tokenService;

    /**
     * preHandle在链接到达前进行判断，return false：拒绝链接；return true：通过链接
     *      PS: 我在此处将所有的false输出改成了抛出异常，然后统一处理返回，用来明确输出被拒原因。
     *
     * @param request   请求
     * @param response  请求
     * @param handler
     * @return  false：拒绝链接；
     *          true：通过链接；
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        log.info(" ========== 进入拦截器 ========== ");

        //  获取token
        String token = request.getHeader(CommonConstants.AUTH_TOKEN);

        //  判断token是否存在
        if (StringUtils.isEmpty(token)){
            log.info(" ========== token为空 ========== ");
            throw new CustomException(ErrorCode.TOKEN_NEVER);
        }

        //  校验token
        boolean checkToken = tokenService.checkToken(token);
        if (!checkToken){
            throw new CustomException(ErrorCode.TOKEN_PARSE_ERROR);
        }

        log.info(" ========== 拦截结束 ========== ");
        return true;
    }
}
